/**
 * 电子邮箱校验
 * @param rule
 * @param value
 * @param callback
 * @returns {Promise<never>|Promise<void>}
 */
export const validateEmail = (rule, value, callback) => {
  if (value && !/^[A-Za-z0-9\u4e00-\u9fa5_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/.test(value)) {
    return callback(new Error('invalid'))
  } else {
    return callback()
  }
}

/**
 * 校验数字是否整数
 * @param rule
 * @param value
 * @param callback
 */
export const checkNumberInteger = (rule, value, callback) => {
  if (value && !/^[1-9]\d*$/.test(value)) {
    callback(new Error('invalid'))
  } else {
    callback()
  }
}

/**
 * 校验数字，保留一位小数
 * @param rule
 * @param value
 * @param callback
 */
export const checkNumberFixed = (rule, value, callback) => {
  if (value && !/^(\d+\.\d{1}|\d+)$/.test(value)) {
    callback(new Error('invalid'))
  } else {
    callback()
  }
}

/**
 * 校验数字，保留两位小数
 * @param rule
 * @param value
 * @param callback
 */
export const checkNumberFixed2 = (rule, value, callback) => {
  if (value && !/^(\d+\.\d{1,2}|\d+)$/.test(value)) {
    callback(new Error('invalid'))
  } else {
    callback()
  }
}

/**
 * 附件验证
 * @param rule
 * @param value
 * @param callback
 */
export function validateAttachment(rule, value, callback) {
  if (!value) {
    callback(new Error(rule.message || '请上传附件'))
  } else if (rule.ref && this.$refs[rule.ref]) {
    const comp = this.$refs[rule.ref]
    if (comp.fileList.length === 0) {
      callback(new Error(rule.message || '请上传附件'))
    } else {
      callback()
    }
  } else {
    callback()
  }
}

/**
 * 多附件类型验证
 * @param rule
 * @param value
 * @param callback
 */
export function validateAttachments(rule, value, callback) {
  if (!value) {
    callback(new Error(rule.message || `请上传${rule.label || '附件'}`))
    return
  }

  if (rule.options?.length && rule.ref && this.$refs[rule.ref]) {
    const fileList = this.$refs[rule.ref].getFileList()
    if (fileList.length === 0) {
      callback(new Error(rule.message || `请上传${rule.label || '附件'}`))
      return
    }

    const uploadTypes = fileList.map(value => value.classify)
    const requireTypes = []
    const options = rule.options
    for (let i = 0; i < options.length; i++) {
      const option = options[i]
      if (option.required && !uploadTypes.includes(option.value)) {
        requireTypes.push(option.label)
      }
    }
    if (requireTypes.length) {
      callback(new Error(`请上传${requireTypes.join('、')}`))
      return
    }
  }
  callback()
}

export function validateIdCard(rule, value, callback) {
  if (
    value &&
    !/^[1-9][0-9]{5}(18|19|(2[0-9]))[0-9]{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)[0-9]{3}[0-9Xx]$/.test(value)
  ) {
    callback(new Error('invalid'))
  } else {
    callback()
  }
}
